home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume37 / linkedlist / part02 < prev    next >
Encoding:
Text File  |  1993-05-04  |  57.0 KB  |  2,218 lines

  1. Newsgroups: comp.sources.misc
  2. From: anita@bouw.tno.nl (Anita Eijs)
  3. Subject: v37i037:  linkedlist - Generic Linked List Package, Part02/02
  4. Message-ID: <1993May4.154424.18359@sparky.imd.sterling.com>
  5. X-Md4-Signature: ebc7dadad33c1bcd5d63c0214cea86f0
  6. Date: Tue, 4 May 1993 15:44:24 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: anita@bouw.tno.nl (Anita Eijs)
  10. Posting-number: Volume 37, Issue 37
  11. Archive-name: linkedlist/part02
  12. Environment: UNIX, MS-DOS, VAX/VMS, Macintosh
  13. Supersedes: linkedlist: Volume 30, Issue 22
  14.  
  15. #! /bin/sh
  16. # This is a shell archive.  Remove anything before this line, then feed it
  17. # into a shell via "sh file" or similar.  To overwrite existing files,
  18. # type "sh file -c".
  19. # Contents:  CHANGES Doc/Intro.3 Doc/lDef.3 Doc/lDel.3 Doc/lDelAll.3
  20. #   Doc/lDelIndxNode.3 Doc/lDelNode.3 Doc/lDump.3 Doc/lFndFlagNode.3
  21. #   Doc/lFndNode.3 Doc/lGetIndxNode.3 Doc/lGetNode.3 Doc/lInfo.3
  22. #   Doc/lInfoIndxNode.3 Doc/lInfoNode.3 Doc/lInsNode.3 Doc/lSort.3
  23. #   Doc/lUndump.3 Doc/lUpdIndxNode.3 Doc/lUpdNode.3 Makefile.BCC
  24. #   Tools_makerule example.c list.h sorttest.c
  25. # Wrapped by kent@sparky on Tue May  4 10:37:10 1993
  26. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
  27. echo If this archive is complete, you will see the following message:
  28. echo '          "shar: End of archive 2 (of 2)."'
  29. if test -f 'CHANGES' -a "${1}" != "-c" ; then 
  30.   echo shar: Will not clobber existing file \"'CHANGES'\"
  31. else
  32.   echo shar: Extracting \"'CHANGES'\" \(381 characters\)
  33.   sed "s/^X//" >'CHANGES' <<'END_OF_FILE'
  34. XMost important changes from version 0.7 to version 0.8 :
  35. X
  36. X-    Routine lIndxNode is renamed to lGetIndxNode.
  37. X
  38. X-    Routine lFlagNode is renamed to lFndFlagNode.
  39. X    The parameter where is added to find several nodes matching the
  40. X    requested flag.
  41. X
  42. X-    Some routines added : lDelIndxNode, lInfoIndxNode, lUpdIndxNode,
  43. X    lSort.
  44. X
  45. X-    Defines are made more specific; FIRST is renamed to lFIRST, etc.
  46. END_OF_FILE
  47.   if test 381 -ne `wc -c <'CHANGES'`; then
  48.     echo shar: \"'CHANGES'\" unpacked with wrong size!
  49.   fi
  50.   # end of 'CHANGES'
  51. fi
  52. if test -f 'Doc/Intro.3' -a "${1}" != "-c" ; then 
  53.   echo shar: Will not clobber existing file \"'Doc/Intro.3'\"
  54. else
  55.   echo shar: Extracting \"'Doc/Intro.3'\" \(7888 characters\)
  56.   sed "s/^X//" >'Doc/Intro.3' <<'END_OF_FILE'
  57. X'.so tmac.clman
  58. X.TH "Intro"
  59. X.IX Intro
  60. X.SH NAME
  61. XIntro - Introduction to the Generic Linked List.
  62. X.SH DESCRIPTION
  63. XThe Generic Linked List package is a package to define, create, update,
  64. Xquery and delete one or more (nodes of) linked lists, to sort linked
  65. Xlists, and so on. The user doesn't have to take care of allocating a
  66. Xnumber of bytes for a node, inserting on the right place, deleting and
  67. Xfreeing a node and so on.
  68. X.br
  69. XDifferent kind of linked lists can be defined. In a \fIsingly\fP linked
  70. Xlist each node points to the next node, in a \fIdoubly\fP linked list
  71. Xeach node points also to the previous node. A \fIchain\fP is a list in
  72. Xwhich the last node has a NULL-pointer and in a \fIcircular\fP linked
  73. Xlist the last node points back to the first node.
  74. X.br
  75. XThe package consists of the following routines :
  76. X.nf
  77. X.if t .ta 0.2i 1.3i
  78. X    lDef    define linked list
  79. X    lInfo    get information about linked list
  80. X    lSort    sort linked list
  81. X    lDel    delete linked list
  82. X    lDelAll    delete all linked lists
  83. X    lDump    dump a linked list to a file
  84. X    lUndump    undump a linked list from a file
  85. X    lInsNode    insert node
  86. X    lInfoNode    get information about node
  87. X    lGetNode    get node
  88. X    lFndNode    find node
  89. X    lFndFlagNode    find node by flag
  90. X    lUpdNode    update current node
  91. X    lDelNode    delete node
  92. X    lInfoIndxNode    get information about node by index
  93. X    lGetIndxNode    get node by index
  94. X    lUpdIndxNode    update node by index
  95. X    lDelIndxNode    delete node by index
  96. X.fi
  97. X.SH ERROR CODES
  98. X.if t .ta 0.2i 1.8i
  99. XHere follows an enumeration of the possible error codes, and their
  100. Xmeanings. For each function-call is specified which error codes
  101. Xcould be expected. The marked errors (*) will also be written to
  102. Xthe error-file \fI=listError=\fP.
  103. X.nf
  104. X    lEMPTY_LIST    linked list doesn't contain any nodes
  105. X    lEOL    end of list reached
  106. X    lNO_LIST    there are no linked lists defined (*)
  107. X    lNOT_DOUBLY    backward searching / retrieving not possible for
  108. X        singly linked list (*)
  109. X    lNOT_FOUND    node not found
  110. X    lOPEN_ERROR    can't open linked list dump file for writing or
  111. X        reading (*)
  112. X    lSIZE_NE    size of expected data and size of node are not
  113. X        equal (*)
  114. X    lUNKNOWN_FUNC    function name is unknown (*)
  115. X    lUNKNOWN_ID    list identifier is unknown (*)
  116. X    lWRONG_CC    parameter \fIcc\fP has wrong value (*)
  117. X    lWRONG_INDEX    index out of range (*)
  118. X    lWRONG_ORDER    parameter \fIorder\fP has wrong value (*)
  119. X    lWRONG_SD    parameter \fIsd\fP has wrong value (*)
  120. X    lWRONG_THEORY    parameter \fItheory\fP has wrong value (*)
  121. X    lWRONG_WHERE    parameter \fIwhere\fP has wrong value (*)
  122. X    lWRONG_WHICH    parameter \fIwhich\fP has wrong value (*)
  123. X.fi
  124. X.SH LIBRARY
  125. X$(TOOLS_HOME)/Lib/list.a
  126. X.SH INCLUDE FILE
  127. X$(TOOLS_HOME)/List/list.h
  128. X.SH PORTABILITY
  129. XThe Generic Linked List package is a very portable tool. The tool is
  130. Xdeveloped on UNIX and ported to MSDOS, VAX-VMS and Macintosh. On
  131. Xthose 'ported' machines the library isn't created, but list.c and list.h
  132. Xwere treated the same as all the other source-files (*.[ch]) of the
  133. Xprogram, which used the Generic Linked List package.
  134. X.SH EXAMPLE
  135. X.if t .ta 0.3i 0.6i 0.9i 1.2i 2.2i 3.2i 4.2i 4.5i 4.8i
  136. X.nf
  137. X#include        <stdio.h>
  138. X#include        "list.h"
  139. X
  140. Xtypedef struct rapport {
  141. X    char        title[30];
  142. X    char        author[15];
  143. X    int        date;
  144. X} Rapport;
  145. Xint    rapSz = sizeof(Rapport);
  146. X
  147. Xstatic void    insRap(), prRapAll(), prRap();
  148. Xstatic int        search(), compare();
  149. X
  150. Xmain()
  151. X{
  152. X    int            id, code, search_date;
  153. X    Rapport        rap;
  154. X
  155. X    id = lDef(lSINGLY, lCHAIN);
  156. X
  157. X    insRap(id, lFIRST, 1, "Book 1", "People", 890129);
  158. X    insRap(id, lFIRST, 2, "Book 2", "More People", 890130);
  159. X    insRap(id, lLAST, 1, "Book 3", "Lots of People", 890131);
  160. X
  161. X    fprintf(stdout, "lGetNode\n");
  162. X    prRapAll(id);
  163. X
  164. X    fprintf(stdout, "lGetIndxNode\n");
  165. X    code = lGetIndxNode(id, 4, &rap, rapSz);
  166. X    prRap(code, &rap);
  167. X    code = lGetIndxNode(id, 2, &rap, rapSz);
  168. X    prRap(code, &rap);
  169. X    code = lGetIndxNode(id, -1, &rap, rapSz);
  170. X    prRap(code, &rap);
  171. X    code = lGetIndxNode(id, 3, &rap, rapSz);
  172. X    prRap(code, &rap);
  173. X
  174. X    fprintf(stdout, "lFndNode\n");
  175. X    search_date = 890129;
  176. X    code = lFndNode(id, lFIRST, search, &search_date, &rap, rapSz);
  177. X    prRap(code, &rap);
  178. X    code = lFndNode(id, lNEXT, search, &search_date, &rap, rapSz);
  179. X    prRap(code, &rap);
  180. X    code = lFndNode(id, lNEXT, search, &search_date, &rap, rapSz);
  181. X    prRap(code, &rap);
  182. X
  183. X    code = lDump(id, "dump");
  184. X    fprintf(stdout, "lDump : %d\n", code);
  185. X
  186. X    lDel(id);
  187. X
  188. X    id = lUndump("dump");
  189. X    fprintf(stdout, "lUndump : %d\n", id);
  190. X
  191. X    insRap(id, lFIRST, 4, "Book 4", "The Author", 891127);
  192. X
  193. X    prRapAll(id);
  194. X
  195. X    fprintf(stdout, "lFndFlagNode\n");
  196. X    code = lFndFlagNode(id, lFIRST, 1, &rap, rapSz);
  197. X    prRap(code, &rap);
  198. X    code = lFndFlagNode(id, lNEXT, 1, &rap, rapSz);
  199. X    prRap(code, &rap);
  200. X    code = lFndFlagNode(id, lFIRST, 2, &rap, rapSz);
  201. X    prRap(code, &rap);
  202. X    code = lFndFlagNode(id, lFIRST, 7, &rap, rapSz);
  203. X    prRap(code, &rap);
  204. X    
  205. X    fprintf(stdout, "Untouched list\n");
  206. X    prRapAll(id);
  207. X
  208. X    fprintf(stdout, "lSort\n");
  209. X    lSort(id, lDESCENDING, lBUBBLE, compare);
  210. X    prRapAll(id);
  211. X
  212. X    fprintf(stdout, "lSort\n");
  213. X    lSort(id, lASCENDING, lHEAP, compare);
  214. X    prRapAll(id);
  215. X
  216. X    lDelAll();
  217. X}
  218. X
  219. Xstatic void
  220. XinsRap(id, where, flag, title, author, date)
  221. Xint    id, where, flag, date;
  222. Xchar    *title, *author;
  223. X{
  224. X    int        code;
  225. X    Rapport    rap;
  226. X
  227. X    strcpy(rap.title, title);
  228. X    strcpy(rap.author, author);
  229. X    rap.date = date;
  230. X    code = lInsNode(id, where, &rap, rapSz, flag);
  231. X}
  232. X
  233. Xstatic void
  234. XprRapAll(id)
  235. Xint    id;
  236. X{
  237. X    int        code;
  238. X    Rapport    rap;
  239. X
  240. X    code = lGetNode(id, lFIRST, &rap, rapSz);
  241. X    prRap(code, &rap);
  242. X    while (code == lFIRST || code == lSUCCESS || code == lLAST) {
  243. X        code = lGetNode(id, lNEXT, &rap, rapSz);
  244. X        prRap(code, &rap);
  245. X    }
  246. X}
  247. X
  248. Xstatic void
  249. XprRap(code, rpprt)
  250. Xint            code;
  251. XRapport        *rpprt;
  252. X{
  253. X    if (code >= 0)
  254. X        fprintf(stdout, "Rapport : '%s' '%s' '%d'\n", rpprt->title,
  255. X            rpprt->author, rpprt->date);
  256. X    else
  257. X        fprintf(stdout, "Return code = %d\n", code);
  258. X}
  259. X
  260. Xstatic int
  261. Xsearch(date, rpprt)
  262. Xint            *date;
  263. XRapport        *rpprt;
  264. X{
  265. X    if (rpprt->date > *date)
  266. X        return(lFOUND);
  267. X    else
  268. X        return(lNOT_FOUND);
  269. X}
  270. X
  271. Xstatic int 
  272. Xcompare(data1, data2)
  273. XRapport *data1, *data2;
  274. X{
  275. X    int    k = strcmp(data1->author, data2->author);
  276. X
  277. X    if (k == 0)
  278. X        return(lSAME);    /* key1 == key2 */
  279. X    else if (k > 0)
  280. X        return(l2LT1);    /* key1 > key2 */
  281. X    else if (k < 0)
  282. X        return(l1LT2);    /* key1 < key2 */
  283. X}
  284. X.fi
  285. X.sp 2
  286. XThis example program produces the following output :
  287. X.nf
  288. X    lGetNode
  289. X    Rapport : 'Book 2' 'More People' '890130'
  290. X    Rapport : 'Book 1' 'People' '890129'
  291. X    Rapport : 'Book 3' 'Lots of People' '890131'
  292. X    Return code = -9
  293. X    lGetIndxNode
  294. X    Return code = -13
  295. X    Rapport : 'Book 1' 'People' '890129'
  296. X    Return code = -13
  297. X    Rapport : 'Book 3' 'Lots of People' '890131'
  298. X    lFndNode
  299. X    Rapport : 'Book 2' 'More People' '890130'
  300. X    Rapport : 'Book 3' 'Lots of People' '890131'
  301. X    Return code = -10
  302. X    lDump : 0
  303. X    lUndump : 1
  304. X    Rapport : 'Book 4' 'The Author' '891127'
  305. X    Rapport : 'Book 2' 'More People' '890130'
  306. X    Rapport : 'Book 1' 'People' '890129'
  307. X    Rapport : 'Book 3' 'Lots of People' '890131'
  308. X    Return code = -9
  309. X    lFndFlagNode
  310. X    Rapport : 'Book 1' 'People' '890129'
  311. X    Rapport : 'Book 3' 'Lots of People' '890131'
  312. X    Rapport : 'Book 2' 'More People' '890130'
  313. X    Return code = -10
  314. X    Untouched list
  315. X    Rapport : 'Book 4' 'The Author' '891127'
  316. X    Rapport : 'Book 2' 'More People' '890130'
  317. X    Rapport : 'Book 1' 'People' '890129'
  318. X    Rapport : 'Book 3' 'Lots of People' '890131'
  319. X    Return code = -9
  320. X    lSort
  321. X    Rapport : 'Book 4' 'The Author' '891127'
  322. X    Rapport : 'Book 1' 'People' '890129'
  323. X    Rapport : 'Book 2' 'More People' '890130'
  324. X    Rapport : 'Book 3' 'Lots of People' '890131'
  325. X    Return code = -9
  326. X    lSort
  327. X    Rapport : 'Book 3' 'Lots of People' '890131'
  328. X    Rapport : 'Book 2' 'More People' '890130'
  329. X    Rapport : 'Book 1' 'People' '890129'
  330. X    Rapport : 'Book 4' 'The Author' '891127'
  331. X    Return code = -9
  332. X.fi
  333. X.SH VERSION
  334. XGeneric Linked List 0.8, March 1993.
  335. X.SH PUBLIC DOMAIN
  336. XThe Generic Linked List package is in the public domain. If you have
  337. Xany comments, suggestions, or find any bugs, or make any changes you'd
  338. Xlike to share, please let me know.
  339. X.SH AUTHOR
  340. XCopyright (c) 1993 by Anita Eijs (anita@bouw.tno.nl).
  341. X.sp 1
  342. X.nf
  343. XTNO - Bouw - BouwInformatica
  344. XP.O. Box 49
  345. X2600 AA Delft
  346. XThe Netherlands
  347. X.fi
  348. END_OF_FILE
  349.   if test 7888 -ne `wc -c <'Doc/Intro.3'`; then
  350.     echo shar: \"'Doc/Intro.3'\" unpacked with wrong size!
  351.   fi
  352.   # end of 'Doc/Intro.3'
  353. fi
  354. if test -f 'Doc/lDef.3' -a "${1}" != "-c" ; then 
  355.   echo shar: Will not clobber existing file \"'Doc/lDef.3'\"
  356. else
  357.   echo shar: Extracting \"'Doc/lDef.3'\" \(1033 characters\)
  358.   sed "s/^X//" >'Doc/lDef.3' <<'END_OF_FILE'
  359. X'.so tmac.clman
  360. X.TH "lDef"
  361. X.IX lDef
  362. X.SH NAME
  363. XlDef - Define linked list.
  364. X.SH SYNOPSIS
  365. Xint
  366. X.BR "lDef" "(sd, cc)"
  367. X.br
  368. X.RT
  369. X.RP
  370. XIn    int    sd    singly or doubly linked list
  371. X.br
  372. X.RP
  373. XIn    int    cc    chain or circular linked list
  374. X.DT
  375. X.SH DESCRIPTION
  376. XTo define a linked list use \fBlDef\fP. It is possible to define a
  377. Xsingly or doubly linked list and a chain or circular linked list.
  378. XThe routine returns the identifier of the defined linked list (\(>= 1),
  379. Xwhich must be used in the other routines of the linked list tool.
  380. X.SH PARAMETER DEFINITIONS
  381. X.if t .ta 0.2i 1.5i
  382. X\fIsd\fP :
  383. X.nf
  384. X    lSINGLY    singly linked list, each node points to the next node
  385. X    lDOUBLY    doubly linked list, each node points to the previous and
  386. X        the next node
  387. X.fi
  388. X\fIcc\fP :
  389. X.nf
  390. X    lCHAIN    chain linked list, last node has a NULL-pointer
  391. X    lCIRCULAR    circular linked list, last node points back to the first node
  392. X.fi
  393. X.SH RETURN CODES
  394. X.nf
  395. XReturn on success :
  396. X    identifier of linked list (\(>= 1)
  397. XReturn on error :
  398. X    lWRONG_SD, lWRONG_CC
  399. X.fi
  400. X.SH AUTHOR
  401. XAnita Eijs (TNO - Bouw - BouwInformatica)
  402. END_OF_FILE
  403.   if test 1033 -ne `wc -c <'Doc/lDef.3'`; then
  404.     echo shar: \"'Doc/lDef.3'\" unpacked with wrong size!
  405.   fi
  406.   # end of 'Doc/lDef.3'
  407. fi
  408. if test -f 'Doc/lDel.3' -a "${1}" != "-c" ; then 
  409.   echo shar: Will not clobber existing file \"'Doc/lDel.3'\"
  410. else
  411.   echo shar: Extracting \"'Doc/lDel.3'\" \(348 characters\)
  412.   sed "s/^X//" >'Doc/lDel.3' <<'END_OF_FILE'
  413. X'.so tmac.clman
  414. X.TH "lDel"
  415. X.IX lDel
  416. X.SH NAME
  417. XlDel - Delete linked list.
  418. X.SH SYNOPSIS
  419. Xint
  420. X.BR "lDel" "(id)"
  421. X.br
  422. X.RT
  423. X.RP
  424. XIn    int    id    identifier of linked list
  425. X.DT
  426. X.SH DESCRIPTION
  427. X\fBlDel\fP deletes a linked list.
  428. X.SH RETURN CODES
  429. X.nf
  430. XReturn on success :
  431. X    lSUCCESS
  432. XReturn on error :
  433. X    lUNKNOWN_ID
  434. X.fi
  435. X.SH AUTHOR
  436. XAnita Eijs (TNO - Bouw - BouwInformatica)
  437. END_OF_FILE
  438.   if test 348 -ne `wc -c <'Doc/lDel.3'`; then
  439.     echo shar: \"'Doc/lDel.3'\" unpacked with wrong size!
  440.   fi
  441.   # end of 'Doc/lDel.3'
  442. fi
  443. if test -f 'Doc/lDelAll.3' -a "${1}" != "-c" ; then 
  444.   echo shar: Will not clobber existing file \"'Doc/lDelAll.3'\"
  445. else
  446.   echo shar: Extracting \"'Doc/lDelAll.3'\" \(322 characters\)
  447.   sed "s/^X//" >'Doc/lDelAll.3' <<'END_OF_FILE'
  448. X'.so tmac.clman
  449. X.TH "lDelAll"
  450. X.IX lDelAll
  451. X.SH NAME
  452. XlDelAll - Delete all linked lists.
  453. X.SH SYNOPSIS
  454. Xint
  455. X.BR "lDelAll" "()"
  456. X.br
  457. X.DT
  458. X.SH DESCRIPTION
  459. X\fBlDelAll\fP deletes all linked lists.
  460. X.SH RETURN CODES
  461. X.nf
  462. XReturn on success :
  463. X    lSUCCESS
  464. XReturn on error :
  465. X    lNO_LIST
  466. X.fi
  467. X.SH AUTHOR
  468. XAnita Eijs (TNO - Bouw - BouwInformatica)
  469. END_OF_FILE
  470.   if test 322 -ne `wc -c <'Doc/lDelAll.3'`; then
  471.     echo shar: \"'Doc/lDelAll.3'\" unpacked with wrong size!
  472.   fi
  473.   # end of 'Doc/lDelAll.3'
  474. fi
  475. if test -f 'Doc/lDelIndxNode.3' -a "${1}" != "-c" ; then 
  476.   echo shar: Will not clobber existing file \"'Doc/lDelIndxNode.3'\"
  477. else
  478.   echo shar: Extracting \"'Doc/lDelIndxNode.3'\" \(617 characters\)
  479.   sed "s/^X//" >'Doc/lDelIndxNode.3' <<'END_OF_FILE'
  480. X'.so tmac.clman
  481. X.TH "lDelIndxNode"
  482. X.IX lDelIndxNode
  483. X.SH NAME
  484. XlDelIndxNode - Delete node by index.
  485. X.SH SYNOPSIS
  486. Xint
  487. X.BR "lDelIndxNode" "(id, index)"
  488. X.br
  489. X.RT
  490. X.RP
  491. XIn    int    id    identifier of linked list
  492. X.br
  493. X.RP
  494. XIn    int    index    index of node which must be deleted
  495. X.DT
  496. X.SH DESCRIPTION
  497. X\fBlDelIndxNode\fP deletes an indexed node from a linked list. Which node
  498. Xmust be deleted can be specified by \fIindex\fP (\(>= 1).
  499. X.SH RETURN CODES
  500. X.nf
  501. XReturn on success :
  502. X    lSUCCESS
  503. XReturn on error :
  504. X    lUNKNOWN_ID, lEMPTY_LIST, lWRONG_INDEX
  505. X.fi
  506. X.SH AUTHOR
  507. X.nf
  508. XAnita Eijs (TNO - Bouw - BouwInformatica)
  509. XShane Brath (University of Wisconsin)
  510. X.fi
  511. END_OF_FILE
  512.   if test 617 -ne `wc -c <'Doc/lDelIndxNode.3'`; then
  513.     echo shar: \"'Doc/lDelIndxNode.3'\" unpacked with wrong size!
  514.   fi
  515.   # end of 'Doc/lDelIndxNode.3'
  516. fi
  517. if test -f 'Doc/lDelNode.3' -a "${1}" != "-c" ; then 
  518.   echo shar: Will not clobber existing file \"'Doc/lDelNode.3'\"
  519. else
  520.   echo shar: Extracting \"'Doc/lDelNode.3'\" \(716 characters\)
  521.   sed "s/^X//" >'Doc/lDelNode.3' <<'END_OF_FILE'
  522. X'.so tmac.clman
  523. X.TH "lDelNode"
  524. X.IX lDelNode
  525. X.SH NAME
  526. XlDelNode - Delete node.
  527. X.SH SYNOPSIS
  528. Xint
  529. X.BR "lDelNode" "(id, which)"
  530. X.br
  531. X.RT
  532. X.RP
  533. XIn    int    id    identifier of linked list
  534. X.br
  535. X.RP
  536. XIn    int    which    which node must be deleted
  537. X.DT
  538. X.SH DESCRIPTION
  539. X\fBlDelNode\fP deletes a node from a linked list. Which node must be
  540. Xdeleted can be specified by \fIwhich\fP. The first, the current and
  541. Xthe last node of a linked list can be deleted.
  542. X.SH PARAMETER DEFINITIONS
  543. X.if t .ta 0.2i 1.5i
  544. X\fIwhich\fP :
  545. X.nf
  546. X    lFIRST    first node
  547. X    lCURRENT    current node
  548. X    lLAST    last node
  549. X.fi
  550. X.SH RETURN CODES
  551. X.nf
  552. XReturn on success :
  553. X    lSUCCESS
  554. XReturn on error :
  555. X    lUNKNOWN_ID, lEMPTY_LIST, lWRONG_WHICH
  556. X.fi
  557. X.SH AUTHOR
  558. XAnita Eijs (TNO - Bouw - BouwInformatica)
  559. END_OF_FILE
  560.   if test 716 -ne `wc -c <'Doc/lDelNode.3'`; then
  561.     echo shar: \"'Doc/lDelNode.3'\" unpacked with wrong size!
  562.   fi
  563.   # end of 'Doc/lDelNode.3'
  564. fi
  565. if test -f 'Doc/lDump.3' -a "${1}" != "-c" ; then 
  566.   echo shar: Will not clobber existing file \"'Doc/lDump.3'\"
  567. else
  568.   echo shar: Extracting \"'Doc/lDump.3'\" \(793 characters\)
  569.   sed "s/^X//" >'Doc/lDump.3' <<'END_OF_FILE'
  570. X'.so tmac.clman
  571. X.TH "lDump"
  572. X.IX lDump
  573. X.SH NAME
  574. XlDump - Dump a linked list to a file.
  575. X.SH SYNOPSIS
  576. Xint
  577. X.BR "lDump" "(id, file)"
  578. X.br
  579. X.RT
  580. X.RP
  581. XIn    int    id    identifier of linked list
  582. X.br
  583. X.RP
  584. XIn    char    *file    name of linked list dump file
  585. X.DT
  586. X.SH DESCRIPTION
  587. X\fBlDump\fP is a linked list dumping utility. It allows the user to store
  588. Xlinked list data in a specially formatted file, so the linked list data can
  589. Xbe used within another program session. This file can be read by the linked
  590. Xlist undumping utility lUndump.
  591. X.br
  592. XDon't use pointers within your data structure, because only the pointers
  593. Xwill be written in the dump file, not the data pointed to.
  594. X.SH RETURN CODES
  595. X.nf
  596. XReturn on success :
  597. X    lSUCCESS
  598. XReturn on error :
  599. X    lUNKNOWN_ID, lOPEN_ERROR
  600. X.fi
  601. X.SH AUTHOR
  602. XAnita Eijs (TNO - Bouw - BouwInformatica)
  603. END_OF_FILE
  604.   if test 793 -ne `wc -c <'Doc/lDump.3'`; then
  605.     echo shar: \"'Doc/lDump.3'\" unpacked with wrong size!
  606.   fi
  607.   # end of 'Doc/lDump.3'
  608. fi
  609. if test -f 'Doc/lFndFlagNode.3' -a "${1}" != "-c" ; then 
  610.   echo shar: Will not clobber existing file \"'Doc/lFndFlagNode.3'\"
  611. else
  612.   echo shar: Extracting \"'Doc/lFndFlagNode.3'\" \(1307 characters\)
  613.   sed "s/^X//" >'Doc/lFndFlagNode.3' <<'END_OF_FILE'
  614. X'.so tmac.clman
  615. X.TH "lFndFlagNode"
  616. X.IX lFndFlagNode
  617. X.SH NAME
  618. XlFndFlagNode - Get node by flag.
  619. X.SH SYNOPSIS
  620. Xint
  621. X.BR "lFndFlagNode" "(id, from, flag, data, size)"
  622. X.br
  623. X.RT
  624. X.RP
  625. XIn    int    id    identifier of linked list
  626. X.br
  627. X.RP
  628. XIn    int    from    from where must be searched
  629. X.br
  630. X.RP
  631. XIn    int    flag    flag of node which must be retrieved
  632. X.br
  633. X.RP
  634. XOut    Byte    *data    data of node
  635. X.br
  636. X.RP
  637. XIn    int    size    size of data
  638. X.DT
  639. X.SH DESCRIPTION
  640. X\fBlFndFlagNode\fP searches a 'flagged' node from the linked list. From
  641. Xwhere the node must be searched can be specified by \fIfrom\fP. A node
  642. Xcan be searched forward from the beginning of the list or from the
  643. Xcurrent node and backward from the current node or from the end of the
  644. Xlist.
  645. X.br
  646. XBackward searching is only possible for doubly linked list.
  647. X.br
  648. XWhen the found node is the first or the last node, the return code will
  649. Xhave the value lFIRST or lLAST, otherwise lFOUND.
  650. X.SH PARAMETER DEFINITIONS
  651. X.if t .ta 0.2i 1.5i
  652. X\fIfrom\fP :
  653. X.nf
  654. X    lFIRST    search forward from first node
  655. X    lPREVIOUS    search backward from previous node
  656. X    lNEXT    search forward from next node
  657. X    lLAST    search backward from last node
  658. X.fi
  659. X.SH RETURN CODES
  660. X.nf
  661. XReturn on success :
  662. X    lFOUND, lFIRST, lLAST, lNOT_FOUND
  663. XReturn on error :
  664. X    lUNKNOWN_ID, lEMPTY_LIST, lWRONG_FROM, lSIZE_NE
  665. X.fi
  666. X.SH AUTHOR
  667. XAnita Eijs (TNO - Bouw - BouwInformatica)
  668. END_OF_FILE
  669.   if test 1307 -ne `wc -c <'Doc/lFndFlagNode.3'`; then
  670.     echo shar: \"'Doc/lFndFlagNode.3'\" unpacked with wrong size!
  671.   fi
  672.   # end of 'Doc/lFndFlagNode.3'
  673. fi
  674. if test -f 'Doc/lFndNode.3' -a "${1}" != "-c" ; then 
  675.   echo shar: Will not clobber existing file \"'Doc/lFndNode.3'\"
  676. else
  677.   echo shar: Extracting \"'Doc/lFndNode.3'\" \(1730 characters\)
  678.   sed "s/^X//" >'Doc/lFndNode.3' <<'END_OF_FILE'
  679. X'.so tmac.clman
  680. X.TH "lFndNode"
  681. X.IX lFndNode
  682. X.SH NAME
  683. XlFndNode - Find node.
  684. X.SH SYNOPSIS
  685. Xint
  686. X.BR "lFndNode" "(id, from, func, ptr, data, size)"
  687. X.br
  688. X.RT
  689. X.RP
  690. XIn    int    id    identifier of linked list
  691. X.br
  692. X.RP
  693. XIn    int    from    from where must be searched
  694. X.br
  695. X.RP
  696. XIn    int    (*func)()    function for checking the data on conditions
  697. X.br
  698. X.RP
  699. XIn    Byte    *ptr    data for comparison in function
  700. X.br
  701. X.RP
  702. XOut    Byte    *data    data of node
  703. X.br
  704. X.RP
  705. XIn    int    size    size of data
  706. X.DT
  707. X.SH DESCRIPTION
  708. X\fBlFndNode\fP searches a node from the linked list, using the user
  709. Xdefined serach function \fIfunc\fP, which checks the data of a node
  710. Xon conditions. This function must have two parameters, a pointer to
  711. Xthe data to compare with and a pointer to the data of a node. The
  712. Xpossible return values are lFOUND or lNOT_FOUND. See the introduction
  713. Xof Generic Linked List for an example of such a search function. From
  714. Xwhere the node must be searched can be specified by \fIfrom\fP. A node
  715. Xcan be searched forward from the beginning of the list or from the
  716. Xcurrent node and backward from the current node or from the end of the
  717. Xlist.
  718. X.br
  719. XBackward searching is only possible for doubly linked list.
  720. X.br
  721. XWhen the found node is the first or the last node, the return code will
  722. Xhave the value lFIRST or lLAST, otherwise lFOUND.
  723. X.SH PARAMETER DEFINITIONS
  724. X.if t .ta 0.2i 1.5i
  725. X\fIfrom\fP :
  726. X.nf
  727. X    lFIRST    search forward from first node
  728. X    lPREVIOUS    search backward from previous node
  729. X    lNEXT    search forward from next node
  730. X    lLAST    search backward from last node
  731. X.fi
  732. X.SH RETURN CODES
  733. X.nf
  734. XReturn on success :
  735. X    lFOUND, lFIRST, lLAST, lNOT_FOUND
  736. XReturn on error :
  737. X.fi
  738. X.in +0.2i
  739. XlUNKNOWN_ID, lEMPTY_LIST, lWRONG_FROM, lUNKNOWN_FUNC, lNOT_DOUBLY
  740. X.in 10.2i
  741. X.SH AUTHOR
  742. XAnita Eijs (TNO - Bouw - BouwInformatica)
  743. END_OF_FILE
  744.   if test 1730 -ne `wc -c <'Doc/lFndNode.3'`; then
  745.     echo shar: \"'Doc/lFndNode.3'\" unpacked with wrong size!
  746.   fi
  747.   # end of 'Doc/lFndNode.3'
  748. fi
  749. if test -f 'Doc/lGetIndxNode.3' -a "${1}" != "-c" ; then 
  750.   echo shar: Will not clobber existing file \"'Doc/lGetIndxNode.3'\"
  751. else
  752.   echo shar: Extracting \"'Doc/lGetIndxNode.3'\" \(835 characters\)
  753.   sed "s/^X//" >'Doc/lGetIndxNode.3' <<'END_OF_FILE'
  754. X'.so tmac.clman
  755. X.TH "lGetIndxNode"
  756. X.IX lGetIndxNode
  757. X.SH NAME
  758. XlGetIndxNode - Get node by index.
  759. X.SH SYNOPSIS
  760. Xint
  761. X.BR "lGetIndxNode" "(id, index, data, size)"
  762. X.br
  763. X.RT
  764. X.RP
  765. XIn    int    id    identifier of linked list
  766. X.RP
  767. XIn    int    index    index of node which must be retrieved
  768. X.RP
  769. XOut    Byte    *data    data of node
  770. X.RP
  771. XIn    int    size    size of data
  772. X.DT
  773. X.SH DESCRIPTION
  774. X\fBlGetIndxNode\fP gets the data of an indexed node of a linked list. Which
  775. Xnode must be retrieved can be specified by \fIindex\fP (\(>= 1).
  776. X.br
  777. XWhen the retrieved node is the first or the last node, the return code
  778. Xwill have the value lFIRST or lLAST. For the other nodes the routine returns
  779. XlSUCCESS.
  780. X.SH RETURN CODES
  781. X.nf
  782. XReturn on success :
  783. X    lSUCCESS, lFIRST, lLAST
  784. XReturn on error :
  785. X    lUNKNOWN_ID, lEMPTY_LIST, lWRONG_INDEX, lSIZE_NE
  786. X.fi
  787. X.SH AUTHOR
  788. XAnita Eijs (TNO - Bouw - BouwInformatica)
  789. END_OF_FILE
  790.   if test 835 -ne `wc -c <'Doc/lGetIndxNode.3'`; then
  791.     echo shar: \"'Doc/lGetIndxNode.3'\" unpacked with wrong size!
  792.   fi
  793.   # end of 'Doc/lGetIndxNode.3'
  794. fi
  795. if test -f 'Doc/lGetNode.3' -a "${1}" != "-c" ; then 
  796.   echo shar: Will not clobber existing file \"'Doc/lGetNode.3'\"
  797. else
  798.   echo shar: Extracting \"'Doc/lGetNode.3'\" \(1241 characters\)
  799.   sed "s/^X//" >'Doc/lGetNode.3' <<'END_OF_FILE'
  800. X'.so tmac.clman
  801. X.TH "lGetNode"
  802. X.IX lGetNode
  803. X.SH NAME
  804. XlGetNode - Get node.
  805. X.SH SYNOPSIS
  806. Xint
  807. X.BR "lGetNode" "(id, which, data, size)"
  808. X.br
  809. X.RT
  810. X.RP
  811. XIn    int    id    identifier of linked list
  812. X.RP
  813. XIn    int    which    which node must be retrieved
  814. X.RP
  815. XOut    Byte    *data    data of node
  816. X.RP
  817. XIn    int    size    size of data
  818. X.DT
  819. X.SH DESCRIPTION
  820. X\fBlGetNode\fP gets the data of a node of a linked list. Which node must
  821. Xbe retrieved can be specified by \fIwhich\fP. The first node, the current
  822. Xnode, the node before or after the current node and the node at the end
  823. Xof the list can be retrieved.
  824. X.br
  825. XBackward retrieving is only possible for doubly linked list. A previous
  826. Xnode can't be retrieved for singly linked lists.
  827. X.br
  828. XWhen the retrieved node is the first or the last node, the return code
  829. Xwill have the value lFIRST or lLAST. For the other nodes the routine
  830. Xreturns lSUCCESS.
  831. X.SH PARAMETER DEFINITIONS
  832. X.if t .ta 0.2i 1.5i
  833. X\fIwhich\fP :
  834. X.nf
  835. X    lFIRST    first node
  836. X    lPREVIOUS    previous node
  837. X    lCURRENT    current node
  838. X    lNEXT    next node
  839. X    lLAST    last node
  840. X.fi
  841. X.SH RETURN CODES
  842. X.nf
  843. XReturn on success :
  844. X    lSUCCESS, lFIRST, lLAST
  845. XReturn on error :
  846. X.fi
  847. X.in +02.i
  848. XlUNKNOWN_ID, lEMPTY_LIST, lWRONG_WHICH, lEOL, lNOT_DOUBLY, lSIZE_NE
  849. X.in -02.i
  850. X.SH AUTHOR
  851. XAnita Eijs (TNO - Bouw - BouwInformatica)
  852. END_OF_FILE
  853.   if test 1241 -ne `wc -c <'Doc/lGetNode.3'`; then
  854.     echo shar: \"'Doc/lGetNode.3'\" unpacked with wrong size!
  855.   fi
  856.   # end of 'Doc/lGetNode.3'
  857. fi
  858. if test -f 'Doc/lInfo.3' -a "${1}" != "-c" ; then 
  859.   echo shar: Will not clobber existing file \"'Doc/lInfo.3'\"
  860. else
  861.   echo shar: Extracting \"'Doc/lInfo.3'\" \(657 characters\)
  862.   sed "s/^X//" >'Doc/lInfo.3' <<'END_OF_FILE'
  863. X'.so tmac.clman
  864. X.TH "lInfo"
  865. X.IX lInfo
  866. X.SH NAME
  867. XlInfo - Get information about linked list.
  868. X.SH SYNOPSIS
  869. Xint
  870. X.BR "lInfo" "(id, sd, cc, n)"
  871. X.br
  872. X.RT
  873. X.RP
  874. XIn    int    id    identifier of linked list
  875. X.RP
  876. XOut    int    *sd    singly or doubly linked list
  877. X.RP
  878. XOut    int    *cc    chain or circular linked list
  879. X.RP
  880. XOut    int    *n    number of nodes
  881. X.DT
  882. X.SH DESCRIPTION
  883. X\fBlInfo\fP returns some information about a linked list. The type of
  884. Xthe linked list (\fIsd\fP and \fIcc\fP, defined by the user) and the
  885. Xnumber of nodes added to the linked list (\fIn\fP).
  886. X.SH RETURN CODES
  887. X.nf
  888. XReturn on success :
  889. X    lSUCCESS
  890. XReturn on error :
  891. X    lUNKNOWN_ID
  892. X.fi
  893. X.SH AUTHOR
  894. XAnita Eijs (TNO - Bouw - BouwInformatica)
  895. END_OF_FILE
  896.   if test 657 -ne `wc -c <'Doc/lInfo.3'`; then
  897.     echo shar: \"'Doc/lInfo.3'\" unpacked with wrong size!
  898.   fi
  899.   # end of 'Doc/lInfo.3'
  900. fi
  901. if test -f 'Doc/lInfoIndxNode.3' -a "${1}" != "-c" ; then 
  902.   echo shar: Will not clobber existing file \"'Doc/lInfoIndxNode.3'\"
  903. else
  904.   echo shar: Extracting \"'Doc/lInfoIndxNode.3'\" \(837 characters\)
  905.   sed "s/^X//" >'Doc/lInfoIndxNode.3' <<'END_OF_FILE'
  906. X'.so tmac.clman
  907. X.TH "lInfoIndxNode"
  908. X.IX lInfoIndxNode
  909. X.SH NAME
  910. XlInfoIndxNode - Get information about node by index.
  911. X.SH SYNOPSIS
  912. Xint
  913. X.BR "lInfoIndxNode" "(id, index, size, flag)"
  914. X.br
  915. X.RT
  916. X.RP
  917. XIn    int    id    identifier of linked list
  918. X.RP
  919. XIn    int    index    index of node which must be inspected
  920. X.RP
  921. XOut    int    *size    size of data of node
  922. X.RP
  923. XOut    int    *flag    user information flag
  924. X.DT
  925. X.SH DESCRIPTION
  926. X\fBlInfoIndxNode\fP returns some information about an indexed node.
  927. XThe size of the data of the node (\fIsize\fP) and the user information
  928. Xflag (\fIflag\fP). Of which node the information must be given can be
  929. Xspecified by \fIindex\fP (\(>= 1).
  930. X.SH RETURN CODES
  931. X.nf
  932. XReturn on success :
  933. X    lSUCCESS
  934. XReturn on error :
  935. X    lUNKNOWN_ID, lEMPTY_LIST, lWRONG_INDEX
  936. X.fi
  937. X.SH AUTHOR
  938. X.nf
  939. XAnita Eijs (TNO - Bouw - BouwInformatica)
  940. XShane Brath (University of Wisconsin)
  941. X.fi
  942. END_OF_FILE
  943.   if test 837 -ne `wc -c <'Doc/lInfoIndxNode.3'`; then
  944.     echo shar: \"'Doc/lInfoIndxNode.3'\" unpacked with wrong size!
  945.   fi
  946.   # end of 'Doc/lInfoIndxNode.3'
  947. fi
  948. if test -f 'Doc/lInfoNode.3' -a "${1}" != "-c" ; then 
  949.   echo shar: Will not clobber existing file \"'Doc/lInfoNode.3'\"
  950. else
  951.   echo shar: Extracting \"'Doc/lInfoNode.3'\" \(1197 characters\)
  952.   sed "s/^X//" >'Doc/lInfoNode.3' <<'END_OF_FILE'
  953. X'.so tmac.clman
  954. X.TH "lInfoNode"
  955. X.IX lInfoNode
  956. X.SH NAME
  957. XlInfoNode - Get information about node.
  958. X.SH SYNOPSIS
  959. Xint
  960. X.BR "lInfoNode" "(id, which, size, flag)"
  961. X.br
  962. X.RT
  963. X.RP
  964. XIn    int    id    identifier of linked list
  965. X.RP
  966. XIn    int    which    which node must be inspected
  967. X.RP
  968. XOut    int    *size    size of data of node
  969. X.RP
  970. XOut    int    *flag    user information flag
  971. X.DT
  972. X.SH DESCRIPTION
  973. X\fBlInfoNode\fP returns some information about a node. The size of
  974. Xthe data of the node (\fIsize\fP) and the user information flag
  975. X(\fIflag\fP). Of which node the information must be given can be
  976. Xspecified by \fIwhich\fP. The first node, the current node, the node
  977. Xbefore or after the current node and the node at the end of the list
  978. Xcan be inspected.
  979. X.br
  980. XBackward retrieving is only possible for doubly linked list. A previous
  981. Xnode can't be inspected for singly linked lists.
  982. X.SH PARAMETER DEFINITIONS
  983. X.if t .ta 0.2i 1.5i
  984. X\fIwhich\fP :
  985. X.nf
  986. X    lFIRST    first node
  987. X    lPREVIOUS    previous node
  988. X    lCURRENT    current node
  989. X    lNEXT    next node
  990. X    lLAST    last node
  991. X.fi
  992. X.SH RETURN CODES
  993. X.nf
  994. XReturn on success :
  995. X    lSUCCESS
  996. XReturn on error :
  997. X.fi
  998. X.in +0.2i
  999. XlUNKNOWN_ID, lEMPTY_LIST, lWRONG_WHICH, lEOL, lNOT_DOUBLY
  1000. X.in -0.2i
  1001. X.SH AUTHOR
  1002. XAnita Eijs (TNO - Bouw - BouwInformatica)
  1003. END_OF_FILE
  1004.   if test 1197 -ne `wc -c <'Doc/lInfoNode.3'`; then
  1005.     echo shar: \"'Doc/lInfoNode.3'\" unpacked with wrong size!
  1006.   fi
  1007.   # end of 'Doc/lInfoNode.3'
  1008. fi
  1009. if test -f 'Doc/lInsNode.3' -a "${1}" != "-c" ; then 
  1010.   echo shar: Will not clobber existing file \"'Doc/lInsNode.3'\"
  1011. else
  1012.   echo shar: Extracting \"'Doc/lInsNode.3'\" \(1074 characters\)
  1013.   sed "s/^X//" >'Doc/lInsNode.3' <<'END_OF_FILE'
  1014. X'.so tmac.clman
  1015. X.TH "lInsNode"
  1016. X.IX lInsNode
  1017. X.SH NAME
  1018. XlInsNode - Insert node.
  1019. X.SH SYNOPSIS
  1020. Xint
  1021. X.BR "lInsNode" "(id, where, data, size, flag)"
  1022. X.br
  1023. X.RT
  1024. X.RP
  1025. XIn    int    id    identifier of linked list
  1026. X.RP
  1027. XIn    int    where    place where node must be inserted
  1028. X.RP
  1029. XIn    Byte    *data    data of node
  1030. X.RP
  1031. XIn    int    size    size of data
  1032. X.RP
  1033. XIn    int    flag    user information flag
  1034. X.DT
  1035. X.SH DESCRIPTION
  1036. X\fBlInsNode\fP inserts a node in a linked list. Where the node must be
  1037. Xinserted can be specified by \fIwhere\fP. A node can be added at the
  1038. Xfront of the list, before or after the current node and at the end of
  1039. Xthe list. For each node a flag can be set by the user, e.g. to identify
  1040. Xthe node or the type of node. When the flag identifies the node you can
  1041. Xretrieve the nodes by flag (lFndFlagNode).
  1042. X.SH PARAMETER DEFINITIONS
  1043. X.if t .ta 0.2i 1.5i
  1044. X\fIwhere\fP :
  1045. X.nf
  1046. X    lFIRST    as first node
  1047. X    lBEFORE    before current node
  1048. X    lAFTER    after current node
  1049. X    lLAST    as last node
  1050. X.fi
  1051. X.SH RETURN CODES
  1052. X.nf
  1053. XReturn on success :
  1054. X    lSUCCESS
  1055. XReturn on error :
  1056. X    lUNKNOWN_ID, lWRONG_WHERE
  1057. X.fi
  1058. X.SH AUTHOR
  1059. XAnita Eijs (TNO - Bouw - BouwInformatica)
  1060. END_OF_FILE
  1061.   if test 1074 -ne `wc -c <'Doc/lInsNode.3'`; then
  1062.     echo shar: \"'Doc/lInsNode.3'\" unpacked with wrong size!
  1063.   fi
  1064.   # end of 'Doc/lInsNode.3'
  1065. fi
  1066. if test -f 'Doc/lSort.3' -a "${1}" != "-c" ; then 
  1067.   echo shar: Will not clobber existing file \"'Doc/lSort.3'\"
  1068. else
  1069.   echo shar: Extracting \"'Doc/lSort.3'\" \(1293 characters\)
  1070.   sed "s/^X//" >'Doc/lSort.3' <<'END_OF_FILE'
  1071. X'.so tmac.clman
  1072. X.TH "lSort"
  1073. X.IX lSort
  1074. X.SH NAME
  1075. XlSort - Sort a linked list.
  1076. X.SH SYNOPSIS
  1077. Xint
  1078. X.BR "lSort" "(id, order, theory, func)"
  1079. X.br
  1080. X.RT
  1081. X.RP
  1082. XIn    int    id    identifier of linked list
  1083. X.RP
  1084. XIn    int    order    sorting order
  1085. X.RP
  1086. XIn    int    theory    sorting theory
  1087. X.RP
  1088. XIn    int    (*func)()    function for comparing the data of 2 nodes
  1089. X.DT
  1090. X.SH DESCRIPTION
  1091. X\fBlSort\fP sorts a linked list in the specified \fIorder\fP, using
  1092. Xthe specified \fItheory\fP, and the user defined function \fIfunc\fP,
  1093. Xwhich compares the data of two nodes. This function must have two
  1094. Xparameters, two pointers to the data of a node. The possible return
  1095. Xvalues are lSAME, l1LT2 and l2LT1. See the introduction of Generic
  1096. XLinked List for an example of such a compare function.
  1097. X.SH PARAMETER DEFINITIONS
  1098. X.if t .ta 0.2i 1.5i
  1099. X\fIorder\fP :
  1100. X.nf
  1101. X    lASCENDING    'a', 'b', 'c', ...
  1102. X    lDESCENDING    'z', 'y', 'x', ...
  1103. X.fi
  1104. X\fItheory\fP :
  1105. X.nf
  1106. X    lBUBBLE    bubble sorting algorithm ...
  1107. X    lHEAP    heap sorting algorithm ...
  1108. X    lINSERT    insert sorting algorithm ...
  1109. X    lQUICK    quick sorting algorithm ...
  1110. X    lSELECTION    selection sorting algorithm ...
  1111. X.fi
  1112. X.SH RETURN CODES
  1113. X.nf
  1114. XReturn on success :
  1115. X    lSUCCESS
  1116. XReturn on error :
  1117. X    lUNKNOWN_ID, lEMPTY_LIST, lWRONG_ORDER, lWRONG_THEORY
  1118. X.fi
  1119. X.SH AUTHOR
  1120. X.nf
  1121. XAnita Eijs (TNO - Bouw - BouwInformatica)
  1122. XShane Brath (University of Wisconsin)
  1123. X.fi
  1124. END_OF_FILE
  1125.   if test 1293 -ne `wc -c <'Doc/lSort.3'`; then
  1126.     echo shar: \"'Doc/lSort.3'\" unpacked with wrong size!
  1127.   fi
  1128.   # end of 'Doc/lSort.3'
  1129. fi
  1130. if test -f 'Doc/lUndump.3' -a "${1}" != "-c" ; then 
  1131.   echo shar: Will not clobber existing file \"'Doc/lUndump.3'\"
  1132. else
  1133.   echo shar: Extracting \"'Doc/lUndump.3'\" \(810 characters\)
  1134.   sed "s/^X//" >'Doc/lUndump.3' <<'END_OF_FILE'
  1135. X'.so tmac.clman
  1136. X.TH "lUndump"
  1137. X.IX lUndump
  1138. X.SH NAME
  1139. XlUndump - Undump a linked list from a file.
  1140. X.SH SYNOPSIS
  1141. Xint
  1142. X.BR "lUndump" "(file)"
  1143. X.br
  1144. X.RT
  1145. X.RP
  1146. XIn    char    *file    name of linked list dump file
  1147. X.DT
  1148. X.SH DESCRIPTION
  1149. X\fBlUndump\fP is a linked list undumping utility. The user will be able to
  1150. Xuse linked list data that was saved by lDump in the same or an earlier
  1151. Xprogram session. The linked list data was saved in a specially formatted
  1152. Xfile by lDump. The routine returns the identifier of the undumped linked
  1153. Xlist (\(>= 1), which must be used in the other routines of the linked list
  1154. Xtool. This identifier doesn't have to be the same as used by lDump.
  1155. X.SH RETURN CODES
  1156. X.nf
  1157. XReturn on success :
  1158. X    identifier of linked list (\(>=1)
  1159. XReturn on error :
  1160. X    lOPEN_ERROR
  1161. X.fi
  1162. X.SH AUTHOR
  1163. XAnita Eijs (TNO - Bouw - BouwInformatica)
  1164. END_OF_FILE
  1165.   if test 810 -ne `wc -c <'Doc/lUndump.3'`; then
  1166.     echo shar: \"'Doc/lUndump.3'\" unpacked with wrong size!
  1167.   fi
  1168.   # end of 'Doc/lUndump.3'
  1169. fi
  1170. if test -f 'Doc/lUpdIndxNode.3' -a "${1}" != "-c" ; then 
  1171.   echo shar: Will not clobber existing file \"'Doc/lUpdIndxNode.3'\"
  1172. else
  1173.   echo shar: Extracting \"'Doc/lUpdIndxNode.3'\" \(817 characters\)
  1174.   sed "s/^X//" >'Doc/lUpdIndxNode.3' <<'END_OF_FILE'
  1175. X'.so tmac.clman
  1176. X.TH "lUpdIndxNode"
  1177. X.IX lUpdIndxNode
  1178. X.SH NAME
  1179. XlUpdIndxNode - Update node by index.
  1180. X.SH SYNOPSIS
  1181. Xint
  1182. X.BR "lUpdIndxNode" "(id, index, data, size, flag)"
  1183. X.br
  1184. X.RT
  1185. X.RP
  1186. XIn    int    id    identifier of linked list
  1187. X.RP
  1188. XIn    int    index    index of node which must be updated
  1189. X.RP
  1190. XIn    Byte    *data    updated data of node
  1191. X.RP
  1192. XIn    int    size    size of data
  1193. X.RP
  1194. XIn    int    flag    updated user information flag
  1195. X.DT
  1196. X.SH DESCRIPTION
  1197. X\fBlUpdIndxNode\fP updates an indexed node in a linked list, in fact
  1198. Xthis routine replaces the data of the indexed node by the data of the
  1199. Xupdated node. The flag for user information can also be updated.
  1200. X.SH RETURN CODES
  1201. X.nf
  1202. XReturn on success :
  1203. X    lSUCCESS
  1204. XReturn on error :
  1205. X    lUNKNOWN_ID, lEMPTY_LIST, lWRONG_INDEX
  1206. X.fi
  1207. X.SH AUTHOR
  1208. X.nf
  1209. XAnita Eijs (TNO - Bouw - BouwInformatica)
  1210. XShane Brath (University of Wisconsin)
  1211. X.fi
  1212. END_OF_FILE
  1213.   if test 817 -ne `wc -c <'Doc/lUpdIndxNode.3'`; then
  1214.     echo shar: \"'Doc/lUpdIndxNode.3'\" unpacked with wrong size!
  1215.   fi
  1216.   # end of 'Doc/lUpdIndxNode.3'
  1217. fi
  1218. if test -f 'Doc/lUpdNode.3' -a "${1}" != "-c" ; then 
  1219.   echo shar: Will not clobber existing file \"'Doc/lUpdNode.3'\"
  1220. else
  1221.   echo shar: Extracting \"'Doc/lUpdNode.3'\" \(677 characters\)
  1222.   sed "s/^X//" >'Doc/lUpdNode.3' <<'END_OF_FILE'
  1223. X'.so tmac.clman
  1224. X.TH "lUpdNode"
  1225. X.IX lUpdNode
  1226. X.SH NAME
  1227. XlUpdNode - Update current node.
  1228. X.SH SYNOPSIS
  1229. Xint
  1230. X.BR "lUpdNode" "(id, data, size, flag)"
  1231. X.br
  1232. X.RT
  1233. X.RP
  1234. XIn    int    id    identifier of linked list
  1235. X.RP
  1236. XIn    Byte    *data    updated data of node
  1237. X.RP
  1238. XIn    int    size    size of data
  1239. X.RP
  1240. XIn    int    flag    updated user information flag
  1241. X.DT
  1242. X.SH DESCRIPTION
  1243. X\fBlUpdNode\fP updates the current node in a linked list, in fact
  1244. Xthis routine replaces the data of the current node by the data of the
  1245. Xupdated node. The flag for user information can also be updated.
  1246. X.SH RETURN CODES
  1247. X.nf
  1248. XReturn on success :
  1249. X    lSUCCESS
  1250. XReturn on error :
  1251. X    lUNKNOWN_ID, lEMPTY_LIST
  1252. X.fi
  1253. X.SH AUTHOR
  1254. XAnita Eijs (TNO - Bouw - BouwInformatica)
  1255. END_OF_FILE
  1256.   if test 677 -ne `wc -c <'Doc/lUpdNode.3'`; then
  1257.     echo shar: \"'Doc/lUpdNode.3'\" unpacked with wrong size!
  1258.   fi
  1259.   # end of 'Doc/lUpdNode.3'
  1260. fi
  1261. if test -f 'Makefile.BCC' -a "${1}" != "-c" ; then 
  1262.   echo shar: Will not clobber existing file \"'Makefile.BCC'\"
  1263. else
  1264.   echo shar: Extracting \"'Makefile.BCC'\" \(5737 characters\)
  1265.   sed "s/^X//" >'Makefile.BCC' <<'END_OF_FILE'
  1266. X.AUTODEPEND
  1267. X
  1268. X#
  1269. X# Linked List Tool -- makefile for Borland C++ v3.1
  1270. X#
  1271. X# Gabe Helou <gabe@angus.mi.org>, September 1992
  1272. X#                                                                 
  1273. X# This make file has been tested with MS-DOS versions of tar, shar,
  1274. X# zip, and lha.
  1275. X#
  1276. X
  1277. XTOOLS_HOME     = c:\usr
  1278. XMAKERULE       = Tools_makerule
  1279. X
  1280. X# Name of current directory
  1281. XDIR    = .
  1282. X
  1283. X# Name of library
  1284. XLIB    = $(TOOLS_HOME)\lib
  1285. X
  1286. X# Name of user include dir
  1287. XINC    = $(TOOLS_HOME)\include
  1288. X
  1289. X# Contents of current directory
  1290. XLIST   = Makefile README example.c list.c list.h
  1291. X
  1292. X#          *Translator Definitions*
  1293. X
  1294. XCC = bcc +list.CFG
  1295. XFLAGS       = -O2 -c
  1296. XTASM        = TASM
  1297. XTLIB        = tlib
  1298. XTLINK       = tlink
  1299. XSHAR        = shar -v -c -pXX
  1300. X
  1301. XLIBPATH     = $(BCDIR)\lib
  1302. XINCLUDEPATH = $(BCDIR)\include
  1303. X
  1304. XTARFILE     = $(TOOLS_HOME)\llistt.tar
  1305. XSHARFILE    = $(TOOLS_HOME)\llistt.shr
  1306. XZIPFILE     = $(TOOLS_HOME)\llistt.zip
  1307. XLHAFILE     = $(TOOLS_HOME)\llistt.lzh
  1308. X
  1309. X# Doc list for shar
  1310. XDOC_1 = Doc/Intro.1    Doc/lDef.1      Doc/lDel.1      Doc/lDelAll.1
  1311. XDOC_2 = Doc/lDelNode.1 Doc/lDump.1     Doc/lFlagNode.1 Doc/lFndNode.1
  1312. XDOC_3 = Doc/lGetNode.1 Doc/lIndxNode.1 Doc/lInfo.1     Doc/lInfoNode.1
  1313. XDOC_4 = Doc/lInsNode.1 Doc/lUndump.1   Doc/lUpdNode.1
  1314. X
  1315. XDOC_ALL_1 = Doc/Intro.man    Doc/lDef.man      Doc/lDel.man      Doc/lDelAll.man
  1316. XDOC_ALL_2 = Doc/lDelNode.man Doc/lDump.man     Doc/lFlagNode.man Doc/lFndNode.man
  1317. XDOC_ALL_3 = Doc/lGetNode.man Doc/lIndxNode.man Doc/lInfo.man     Doc/lInfoNode.man
  1318. XDOC_ALL_4 = Doc/lInsNode.man Doc/lUndump.man   Doc/lUpdNode.man  
  1319. XDOC_ALL_5 = Doc/list_doc.ps
  1320. X
  1321. X#              *Implicit Rules*
  1322. X
  1323. X.c.obj:
  1324. X  $(CC) $(FLAGS) {$< }
  1325. X
  1326. X.cpp.obj:
  1327. X  $(CC) $(FLAGS) {$< }
  1328. X
  1329. X
  1330. X#              *List Macros*
  1331. X
  1332. XLIB_dependencies =  \
  1333. X  list.obj
  1334. X
  1335. X
  1336. X#              *Targets*
  1337. X
  1338. Xusge:   usage.msg
  1339. X    type usage.msg
  1340. X
  1341. Xall:      lib
  1342. X
  1343. Xinstall:  newlib
  1344. X
  1345. Xclean:
  1346. X    del list.obj
  1347. X    del list.lib
  1348. X    
  1349. Xlist.lib: lib
  1350. X
  1351. Xlib:      list.cfg $(LIB_dependencies)
  1352. X    del list.lib
  1353. X    $(TLIB) /C /E /e list.lib +list.obj
  1354. X
  1355. Xnewlib:   list.h list.lib
  1356. X    copy list.lib $(LIB)
  1357. X    copy list.h   $(INC)
  1358. X
  1359. Xofiles:   $(LIB_dependencies)
  1360. X
  1361. Xtest:     example
  1362. X
  1363. Xexample:  $(LIB)\list.lib example.obj
  1364. X        $(CC) -c $(FLAGS) example.c
  1365. X        $(TLINK) /v/x/c/P-/L$(LIBPATH);$(LIB) @&&|
  1366. Xc0l.obj+
  1367. Xexample.obj
  1368. Xexample
  1369. X                    # no map file
  1370. Xemu.lib+
  1371. Xmathl.lib+
  1372. Xlist.lib+
  1373. Xcl.lib
  1374. X|
  1375. X
  1376. Xtar:    doc.lst doc_all.lst src.lst
  1377. X        echo Making tar-file in $(TARFILE)
  1378. X        type doc.lst      >  $$tartmp
  1379. X        type doc_all.lst  >> $$tartmp
  1380. X        echo $(MAKERULE)  >> $$tartmp
  1381. X        type src.lst      >> $$tartmp
  1382. X        tar -cvf $(TARFILE) -T $$tartmp
  1383. X        del $$tartmp
  1384. X
  1385. Xshar:
  1386. X        echo Making shar-file in $(SHARFILE)
  1387. X        $(SHAR) $(MAKERULE) >  $(SHARFILE)
  1388. X        $(SHAR) $(LIST)     >> $(SHARFILE)
  1389. X        $(SHAR) $(DOC_1)    >> $(SHARFILE)
  1390. X        $(SHAR) $(DOC_2)    >> $(SHARFILE)
  1391. X        $(SHAR) $(DOC_3)    >> $(SHARFILE)
  1392. X        $(SHAR) $(DOC_4)    >> $(SHARFILE)
  1393. X        $(SHAR) $(DOC_ALL_1)>> $(SHARFILE)
  1394. X        $(SHAR) $(DOC_ALL_2)>> $(SHARFILE)
  1395. X        $(SHAR) $(DOC_ALL_3)>> $(SHARFILE)
  1396. X        $(SHAR) $(DOC_ALL_4)>> $(SHARFILE)
  1397. X        $(SHAR) $(DOC_ALL_5)>> $(SHARFILE)
  1398. X        dos2unix $(SHARFILE)
  1399. X
  1400. Xshort_shar:
  1401. X        echo Making short shar-file in $(SHARFILE)
  1402. X        $(SHAR) $(MAKERULE) >  $(SHARFILE)
  1403. X        $(SHAR) $(LIST)     >> $(SHARFILE)
  1404. X        $(SHAR) $(DOC_1)    >> $(SHARFILE)
  1405. X        $(SHAR) $(DOC_2)    >> $(SHARFILE)
  1406. X        $(SHAR) $(DOC_3)    >> $(SHARFILE)
  1407. X        $(SHAR) $(DOC_4)    >> $(SHARFILE)
  1408. X        dos2unix $(SHARFILE)
  1409. X
  1410. Xzip:    doc.lst doc_all.lst
  1411. X        echo Making ZIP-file in $(ZIPFILE)
  1412. X        pkzip -ap $(ZIPFILE) $(MAKERULE) $(LIST)
  1413. X        pkzip -ap $(ZIPFILE) @doc.lst
  1414. X        pkzip -ap $(ZIPFILE) @doc_all.lst
  1415. X#                           zip    $(ZIPFILE) $(MAKERULE) $(LIST)
  1416. X#        type doc.lst     | zip -@ $(ZIPFILE)
  1417. X#        type doc_all.lst | zip -@ $(ZIPFILE)
  1418. X
  1419. Xlha:    doc.lst doc_all.lst
  1420. X        echo Making lha-file in $(LHAFILE)
  1421. X        lha a /x1 $(LHAFILE) $(MAKERULE) $(LIST)
  1422. X        lha a /x1 $(LHAFILE) @doc.lst
  1423. X        lha a /x1 $(LHAFILE) @doc_all.lst
  1424. X
  1425. Xlist.obj: list.cfg list.c list.h
  1426. X
  1427. Xusage.msg:  makefile.bcc
  1428. X    copy &&|
  1429. X
  1430. X  Makefile of directory $(DIR)
  1431. X
  1432. X  Targets are:
  1433. X
  1434. X     usge         = Prints this
  1435. X     lib          = Make objects for LIB
  1436. X     newlib       = Make objects and place them in LIB
  1437. X     ofiles       = Make objects
  1438. X     test/example = Make test program
  1439. X     tar          = Make TARFILE
  1440. X     shar         = Make SHARFILE
  1441. X     zip          = Make ZIPFILE
  1442. X     lha          = Make LHAFILE
  1443. X
  1444. X     all          = same as 'lib'
  1445. X     install      = same as 'newlib'
  1446. X     clean        = remove object files and temp files
  1447. X
  1448. X  defaults:
  1449. X
  1450. X     TARFILE  = $(TARFILE)
  1451. X     LIB      = $(LIB)
  1452. X     SHARFILE = $(SHARFILE)
  1453. X     ZIPFILE  = $(ZIPFILE)
  1454. X     LHAFILE  = $(LHAFILE)
  1455. X
  1456. X| usage.msg
  1457. X
  1458. X# Documentation
  1459. Xdoc.lst:  makefile.bcc
  1460. X   copy &&|
  1461. XDoc/Intro.1             
  1462. XDoc/lDef.1
  1463. XDoc/lDel.1
  1464. XDoc/lDelAll.1
  1465. XDoc/lDelNode.1
  1466. XDoc/lDump.1
  1467. XDoc/lFlagNode.1
  1468. XDoc/lFndNode.1
  1469. XDoc/lGetNode.1
  1470. XDoc/lIndxNode.1
  1471. XDoc/lInfo.1
  1472. XDoc/lInfoNode.1
  1473. XDoc/lInsNode.1
  1474. XDoc/lUndump.1
  1475. XDoc/lUpdNode.1
  1476. X| doc.lst
  1477. X
  1478. Xdoc_all.lst:  makefile.bcc
  1479. X   copy &&|
  1480. XDoc/list_doc.ps
  1481. XDoc/Intro.man
  1482. XDoc/lDef.man
  1483. XDoc/lDel.man
  1484. XDoc/lDelAll.man
  1485. XDoc/lDelNode.man
  1486. XDoc/lDump.man
  1487. XDoc/lFlagNode.man
  1488. XDoc/lFndNode.man
  1489. XDoc/lGetNode.man
  1490. XDoc/lIndxNode.man
  1491. XDoc/lInfo.man
  1492. XDoc/lInfoNode.man
  1493. XDoc/lInsNode.man
  1494. XDoc/lUndump.man
  1495. XDoc/lUpdNode.man
  1496. X| doc_all.lst
  1497. X
  1498. Xsrc.lst:  makefile.bcc
  1499. X   copy &&|
  1500. XMakefile
  1501. XREADME
  1502. Xexample.c 
  1503. Xlist.c 
  1504. Xlist.h
  1505. X| src.lst
  1506. X
  1507. Xlist.cfg: makefile.bcc
  1508. X   copy &&|
  1509. X-ml
  1510. X-v
  1511. X-vi-
  1512. X-H=list.SYM
  1513. X-w-ret
  1514. X-w-nci
  1515. X-w-inl
  1516. X-wamp
  1517. X-w-par
  1518. X-w-cpt
  1519. X-w-dup
  1520. X-w-pia
  1521. X-w-ill
  1522. X-w-sus
  1523. X-wstv
  1524. X-w-ext
  1525. X-w-ias
  1526. X-w-ibc
  1527. X-w-pre
  1528. X-w-nst
  1529. X-I$(INCLUDEPATH)
  1530. X-L$(LIBPATH)
  1531. X-DANSI
  1532. X-DMSDOS
  1533. X| list.cfg
  1534. END_OF_FILE
  1535.   if test 5737 -ne `wc -c <'Makefile.BCC'`; then
  1536.     echo shar: \"'Makefile.BCC'\" unpacked with wrong size!
  1537.   fi
  1538.   # end of 'Makefile.BCC'
  1539. fi
  1540. if test -f 'Tools_makerule' -a "${1}" != "-c" ; then 
  1541.   echo shar: Will not clobber existing file \"'Tools_makerule'\"
  1542. else
  1543.   echo shar: Extracting \"'Tools_makerule'\" \(827 characters\)
  1544.   sed "s/^X//" >'Tools_makerule' <<'END_OF_FILE'
  1545. XTARFILE        = /tmp/Tools$(DIR).tar
  1546. XSHARFILE    = /tmp/Tools$(DIR).shar
  1547. XAR        = ar
  1548. X# RANLIB should be :
  1549. X# echo :    IRIX System V Release 3.3.1, Silicon Graphics, Inc.
  1550. X# ranlib :    Sun Sparc2 SunOS, Berkeley UNIX
  1551. X#    (AE, Dec 91)
  1552. X#RANLIB        = echo "Ready with"
  1553. XRANLIB        = ranlib
  1554. XCOFLAGS        = -q
  1555. XCFLAGS        = -O
  1556. X
  1557. X# Set defaults for macro's
  1558. XECHO        = echo $(INDNTTN)
  1559. XARG_INDNTTN    = INDNTTN="$(INDNTTN)'    '"
  1560. X
  1561. X# Help macro
  1562. XUSAGE_ID    = "Makefile of directory $(DIR)"
  1563. XUSAGE_TARGETS    = "Targets are:"
  1564. XUSAGE_USAGE    = "usage        = Prints this"
  1565. XUSAGE_LIB    = "lib        = Make objects for LIB"
  1566. XUSAGE_NEWLIB    = "newlib        = Make objects and place them in LIB"
  1567. XUSAGE_OFILES    = "ofiles        = Make objects"
  1568. XUSAGE_TEST    = "test/example    = Make test program"
  1569. XUSAGE_TAR    = "tar        = Make TARFILE"
  1570. XUSAGE_DEFLTS1    = "defaults:"
  1571. XUSAGE_DEFLTS2    = "    TARFILE = $(TARFILE)"
  1572. XUSAGE_DEFLTS3    = "    LIB = $(LIB)"
  1573. END_OF_FILE
  1574.   if test 827 -ne `wc -c <'Tools_makerule'`; then
  1575.     echo shar: \"'Tools_makerule'\" unpacked with wrong size!
  1576.   fi
  1577.   # end of 'Tools_makerule'
  1578. fi
  1579. if test -f 'example.c' -a "${1}" != "-c" ; then 
  1580.   echo shar: Will not clobber existing file \"'example.c'\"
  1581. else
  1582.   echo shar: Extracting \"'example.c'\" \(3052 characters\)
  1583.   sed "s/^X//" >'example.c' <<'END_OF_FILE'
  1584. X#include        <stdio.h>
  1585. X#include        "list.h"
  1586. X
  1587. Xtypedef struct rapport {
  1588. X    char        title[30];
  1589. X    char        author[15];
  1590. X    int        date;
  1591. X} Rapport;
  1592. Xint    rapSz = sizeof(Rapport);
  1593. X
  1594. Xstatic void    insRap(), prRapAll(), prRap();
  1595. Xstatic int        search(), compare();
  1596. X
  1597. Xmain()
  1598. X{
  1599. X    int            id, code, search_date;
  1600. X    Rapport        rap;
  1601. X
  1602. X    id = lDef(lSINGLY, lCHAIN);
  1603. X
  1604. X    insRap(id, lFIRST, 1, "Book 1", "People", 890129);
  1605. X    insRap(id, lFIRST, 2, "Book 2", "More People", 890130);
  1606. X    insRap(id, lLAST, 1, "Book 3", "Lots of People", 890131);
  1607. X
  1608. X    fprintf(stdout, "lGetNode\n");
  1609. X    prRapAll(id);
  1610. X
  1611. X    fprintf(stdout, "lGetIndxNode\n");
  1612. X    code = lGetIndxNode(id, 4, &rap, rapSz);
  1613. X    prRap(code, &rap);
  1614. X    code = lGetIndxNode(id, 2, &rap, rapSz);
  1615. X    prRap(code, &rap);
  1616. X    code = lGetIndxNode(id, -1, &rap, rapSz);
  1617. X    prRap(code, &rap);
  1618. X    code = lGetIndxNode(id, 3, &rap, rapSz);
  1619. X    prRap(code, &rap);
  1620. X
  1621. X    fprintf(stdout, "lFndNode\n");
  1622. X    search_date = 890129;
  1623. X    code = lFndNode(id, lFIRST, search, &search_date, &rap, rapSz);
  1624. X    prRap(code, &rap);
  1625. X    code = lFndNode(id, lNEXT, search, &search_date, &rap, rapSz);
  1626. X    prRap(code, &rap);
  1627. X    code = lFndNode(id, lNEXT, search, &search_date, &rap, rapSz);
  1628. X    prRap(code, &rap);
  1629. X
  1630. X    code = lDump(id, "dump");
  1631. X    fprintf(stdout, "lDump : %d\n", code);
  1632. X
  1633. X    lDel(id);
  1634. X
  1635. X    id = lUndump("dump");
  1636. X    fprintf(stdout, "lUndump : %d\n", id);
  1637. X
  1638. X    insRap(id, lFIRST, 4, "Book 4", "The Author", 891127);
  1639. X
  1640. X    prRapAll(id);
  1641. X
  1642. X    fprintf(stdout, "lFndFlagNode\n");
  1643. X    code = lFndFlagNode(id, lFIRST, 1, &rap, rapSz);
  1644. X    prRap(code, &rap);
  1645. X    code = lFndFlagNode(id, lNEXT, 1, &rap, rapSz);
  1646. X    prRap(code, &rap);
  1647. X    code = lFndFlagNode(id, lFIRST, 2, &rap, rapSz);
  1648. X    prRap(code, &rap);
  1649. X    code = lFndFlagNode(id, lFIRST, 7, &rap, rapSz);
  1650. X    prRap(code, &rap);
  1651. X    
  1652. X    fprintf(stdout, "Untouched list\n");
  1653. X    prRapAll(id);
  1654. X
  1655. X    fprintf(stdout, "lSort\n");
  1656. X    lSort(id, lDESCENDING, lBUBBLE, compare);
  1657. X    prRapAll(id);
  1658. X
  1659. X    fprintf(stdout, "lSort\n");
  1660. X    lSort(id, lASCENDING, lHEAP, compare);
  1661. X    prRapAll(id);
  1662. X
  1663. X    lDelAll();
  1664. X}
  1665. X
  1666. Xstatic void
  1667. XinsRap(id, where, flag, title, author, date)
  1668. Xint    id, where, flag, date;
  1669. Xchar    *title, *author;
  1670. X{
  1671. X    int        code;
  1672. X    Rapport    rap;
  1673. X
  1674. X    strcpy(rap.title, title);
  1675. X    strcpy(rap.author, author);
  1676. X    rap.date = date;
  1677. X    code = lInsNode(id, where, &rap, rapSz, flag);
  1678. X}
  1679. X
  1680. Xstatic void
  1681. XprRapAll(id)
  1682. Xint    id;
  1683. X{
  1684. X    int        code;
  1685. X    Rapport    rap;
  1686. X
  1687. X    code = lGetNode(id, lFIRST, &rap, rapSz);
  1688. X    prRap(code, &rap);
  1689. X    while (code == lFIRST || code == lSUCCESS || code == lLAST) {
  1690. X        code = lGetNode(id, lNEXT, &rap, rapSz);
  1691. X        prRap(code, &rap);
  1692. X    }
  1693. X}
  1694. X
  1695. Xstatic void
  1696. XprRap(code, rpprt)
  1697. Xint            code;
  1698. XRapport        *rpprt;
  1699. X{
  1700. X    if (code >= 0)
  1701. X        fprintf(stdout, "Rapport : '%s' '%s' '%d'\n", rpprt->title,
  1702. X            rpprt->author, rpprt->date);
  1703. X    else
  1704. X        fprintf(stdout, "Return code = %d\n", code);
  1705. X}
  1706. X
  1707. Xstatic int
  1708. Xsearch(date, rpprt)
  1709. Xint            *date;
  1710. XRapport        *rpprt;
  1711. X{
  1712. X    if (rpprt->date > *date)
  1713. X        return(lFOUND);
  1714. X    else
  1715. X        return(lNOT_FOUND);
  1716. X}
  1717. X
  1718. Xstatic int 
  1719. Xcompare(data1, data2)
  1720. XRapport *data1, *data2;
  1721. X{
  1722. X    int    k = strcmp(data1->author, data2->author);
  1723. X
  1724. X    if (k == 0)
  1725. X        return(lSAME);    /* key1 == key2 */
  1726. X    else if (k > 0)
  1727. X        return(l2LT1);    /* key1 > key2 */
  1728. X    else if (k < 0)
  1729. X        return(l1LT2);    /* key1 < key2 */
  1730. X}
  1731. END_OF_FILE
  1732.   if test 3052 -ne `wc -c <'example.c'`; then
  1733.     echo shar: \"'example.c'\" unpacked with wrong size!
  1734.   fi
  1735.   # end of 'example.c'
  1736. fi
  1737. if test -f 'list.h' -a "${1}" != "-c" ; then 
  1738.   echo shar: Will not clobber existing file \"'list.h'\"
  1739. else
  1740.   echo shar: Extracting \"'list.h'\" \(3467 characters\)
  1741.   sed "s/^X//" >'list.h' <<'END_OF_FILE'
  1742. X#define    lBUBBLE        1    /* bubble sorting algorithm */
  1743. X#define    lHEAP        2    /* heap sorting algorithm */
  1744. X#define    lINSERT        3    /* insert sorting algorithm */
  1745. X#define    lQUICK        4    /* quick sorting algorithm */
  1746. X#define    lSELECTION    5    /* selection sorting algorithm */
  1747. X
  1748. X/* Sorting defines by shane.s.brath@uwrf.edu */
  1749. X#define lASCENDING 1
  1750. X#define lDESCENDING -1
  1751. X
  1752. X#define    lSAME        1    /* compared nodes are the same */
  1753. X#define    l1LT2        2    /* first node is less than second node */
  1754. X#define    l2LT1        3    /* second node is less than first node */
  1755. X
  1756. X#define    lSUCCESS    0    /* function call ended successfully */
  1757. X
  1758. X#define    lSINGLY        1    /* singly linked list */
  1759. X#define    lDOUBLY        2    /* doubly linked list */
  1760. X#define    lCHAIN        3    /* chain linked list */
  1761. X#define    lCIRCULAR    4    /* circular linked list */
  1762. X
  1763. X#define    lFIRST        1    /* add at front of list */
  1764. X                /* get/find/delete first node */
  1765. X#define    lPREVIOUS    2    /* get/find previous node */
  1766. X#define    lBEFORE        3    /* add before current node */
  1767. X#define    lCURRENT    4    /* get/delete current node */
  1768. X#define    lAFTER        5    /* add after current node */
  1769. X#define    lNEXT        6    /* get/find next node */
  1770. X#define    lLAST        7    /* add at end of list */
  1771. X                /* get/find/delete last node */
  1772. X
  1773. X#define    lONE_NODE    10    /* add first node to list / delete last node */
  1774. X
  1775. X#define    lWRONG_SD    -1    /* parameter 'sd' has wrong value */
  1776. X#define    lWRONG_CC    -2    /* parameter 'cc' has wrong value */
  1777. X#define    lWRONG_WHERE    -3    /* parameter 'where' has wrong value */
  1778. X#define    lWRONG_WHICH    -4    /* parameter 'which' has wrong value */
  1779. X#define    lUNKNOWN_ID    -5    /* list id is unknown */
  1780. X#define    lUNKNOWN_FUNC    -6    /* function name is unknown */
  1781. X#define    lNO_LIST    -7    /* there are no lists defined */
  1782. X#define    lEMPTY_LIST    -8    /* list is empty */
  1783. X#define    lEOL        -9    /* end of list reached */
  1784. X#define    lNOT_FOUND    -10    /* node not found */
  1785. X#define    lNOT_DOUBLY    -11    /* list is not doubly linked */
  1786. X#define    lSIZE_NE    -12    /* size of expected data and node not equal */
  1787. X#define    lWRONG_INDEX    -13    /* 'index' out of range */
  1788. X#define    lOPEN_ERROR    -14    /* can't open dump-file */
  1789. X#define    lWRONG_ORDER    -15    /* parameter 'order' has wrong value */
  1790. X#define    lWRONG_THEORY    -16    /* parameter 'theory' has wrong value */
  1791. X
  1792. X#define    lFOUND        0    /* node found */
  1793. X
  1794. X#ifdef MSDOS_OR_VAXC
  1795. X#define    lERROR_FILE    "linklist.err"
  1796. X#else
  1797. X#define    lERROR_FILE    "=listError="
  1798. X#endif
  1799. X
  1800. X#ifdef ANSI
  1801. Xtypedef    int        (*Func)();
  1802. Xtypedef    unsigned char    Byte;
  1803. Xint lDef(int sd, int cc);
  1804. Xint lInfo(int id, int *sd, int *cc, int *n);
  1805. Xint lSort(int id, int order, int theory, Func func);
  1806. Xint lDump(int id, char *file);
  1807. Xint lUndump(char *file);
  1808. Xint lDel(int id);
  1809. Xint lDelAll(void);
  1810. Xint lInsNode(int id, int where, Byte *data, int size, int flag);
  1811. Xint lInfoNode(int id, int which, int *size, int *flag);
  1812. Xint lGetNode(int id, int which, Byte *data, int size);
  1813. Xint lFndNode(int id, int where, Func func, Byte *ptr, Byte *data, int size);
  1814. Xint lFndFlagNode(int id, int where, int flag, Byte *data, int size);
  1815. Xint lUpdNode(int id, Byte *data, int size, int flag);
  1816. Xint lDelNode(int id, int which);
  1817. Xint lInfoIndxNode(int id, int index, int *size, int *flag);
  1818. Xint lGetIndxNode(int id, int index, Byte *data, int size);
  1819. Xint lUpdIndxNode(int id, int index, Byte *data, int size, int flag);
  1820. Xint lDelIndxNode(int id, int index);
  1821. X#else
  1822. Xint lDef();
  1823. Xint lInfo();
  1824. Xint lSort();
  1825. Xint lDump();
  1826. Xint lUndump();
  1827. Xint lDel();
  1828. Xint lDelAll();
  1829. Xint lInsNode();
  1830. Xint lInfoNode();
  1831. Xint lGetNode();
  1832. Xint lFndNode();
  1833. Xint lFndFlagNode();
  1834. Xint lUpdNode();
  1835. Xint lDelNode();
  1836. Xint lInfoIndxNode();
  1837. Xint lGetIndxNode();
  1838. Xint lUpdIndxNode();
  1839. Xint lDelIndxNode();
  1840. X#endif
  1841. END_OF_FILE
  1842.   if test 3467 -ne `wc -c <'list.h'`; then
  1843.     echo shar: \"'list.h'\" unpacked with wrong size!
  1844.   fi
  1845.   # end of 'list.h'
  1846. fi
  1847. if test -f 'sorttest.c' -a "${1}" != "-c" ; then 
  1848.   echo shar: Will not clobber existing file \"'sorttest.c'\"
  1849. else
  1850.   echo shar: Extracting \"'sorttest.c'\" \(7365 characters\)
  1851.   sed "s/^X//" >'sorttest.c' <<'END_OF_FILE'
  1852. X/* Sort torture test */
  1853. X
  1854. X#include    <stdio.h>
  1855. X#include    <string.h>
  1856. X#include    "list.h"
  1857. X#include    "time.h"
  1858. X
  1859. Xtypedef struct catalog {
  1860. X    char        number[35];
  1861. X    char        title[40];
  1862. X    char        author[35];
  1863. X    int        date;
  1864. X} catalog;
  1865. X
  1866. Xstatic int    compare_author();
  1867. Xstatic int    compare_title();
  1868. Xstatic void    load_it();
  1869. Xstatic void    print_some();
  1870. Xstatic time_t    what_time();
  1871. Xstatic void    prRap();
  1872. X
  1873. X#ifdef ANSI
  1874. Xstatic int
  1875. Xcompare_author(catalog *a, catalog *b)
  1876. X#else
  1877. Xstatic int
  1878. Xcompare_author(a, b)
  1879. Xcatalog *a, *b;
  1880. X#endif
  1881. X{
  1882. X    int    k;
  1883. X
  1884. X    k = strcmp(a->author, b->author);
  1885. X
  1886. X    if (k == 0)
  1887. X        return(lSAME);
  1888. X    else if (k > 0)
  1889. X        return(l2LT1);
  1890. X    else if (k < 0)
  1891. X        return(l1LT2);
  1892. X}
  1893. X
  1894. X#ifdef ANSI
  1895. Xstatic int
  1896. Xcompare_title(catalog *a, catalog *b, int order)
  1897. X#else
  1898. Xstatic int
  1899. Xcompare_title(a, b, order)
  1900. Xcatalog *a, *b;
  1901. Xint order;
  1902. X#endif
  1903. X{
  1904. X    int    k;
  1905. X
  1906. X    k = strcmp(a->title, b->title);
  1907. X
  1908. X    if (k == 0)
  1909. X        return(lSAME);
  1910. X    else if (k > 0)
  1911. X        return(l2LT1);
  1912. X    else if (k < 0)
  1913. X        return(l1LT2);
  1914. X}
  1915. X
  1916. X#ifdef ANSI
  1917. Xstatic void
  1918. Xload_it(int id, int num)
  1919. X#else
  1920. Xstatic void
  1921. Xload_it(id, num)
  1922. Xint id;
  1923. Xint num;
  1924. X#endif
  1925. X{
  1926. X    int    loop, size = sizeof(catalog), code;
  1927. X    char    c1, c2, c3, c4, c5, c6, c7, c8;
  1928. X    catalog    rap;
  1929. X
  1930. X    c1 = c2 = c3 = c4 = c5 = c6 = c7 = 'A';
  1931. X    c7--;
  1932. X    for (loop=1; loop<=num; loop++) {
  1933. X        c7++;
  1934. X
  1935. X        if (c7>'Z') {c7 = 'A'; c6++;}
  1936. X        if (c6>'Z') {c6 = 'A'; c5++;}
  1937. X        if (c5>'Z') {c5 = 'A'; c4++;}
  1938. X        if (c4>'Z') {c4 = 'A'; c3++;}
  1939. X        if (c3>'Z') {c3 = 'A'; c2++;}
  1940. X        if (c2>'Z') {c2 = 'A'; c1++;}
  1941. X        if (c1>'Z') {c1 = 'A'; c1 = c2 = c3 = c4 = c5 = c6 = c7 = 'A';}
  1942. X
  1943. X        sprintf(rap.number,"B-90-%d", loop);
  1944. X        sprintf(rap.title, "Book %d", loop);
  1945. X        sprintf(rap.author,"%c%c%c%c%c%c%c%d",
  1946. X            c1, c2, c3, c4, c5, c6, c7, loop);
  1947. X        rap.date = 890129;
  1948. X        code = lInsNode(id, lLAST, &rap, size, loop);
  1949. X    }
  1950. X    /* printf("Linked List created\n"); */
  1951. X}
  1952. X
  1953. X#ifdef ANSI
  1954. Xstatic void
  1955. Xprint_some(int id, int num)
  1956. X#else
  1957. Xstatic void
  1958. Xprint_some(id, num)
  1959. Xint id;
  1960. Xint num;
  1961. X#endif
  1962. X{
  1963. X    int    size = sizeof(catalog), loop;
  1964. X    int    code;
  1965. X    catalog    rap;
  1966. X
  1967. X    code = lGetNode(id, lFIRST, &rap, size);
  1968. X    prRap(code, &rap);
  1969. X
  1970. X    for (loop=2; loop<=num; loop++) {
  1971. X        code = lGetNode(id, lNEXT, &rap, size);
  1972. X        prRap(code, &rap);
  1973. X    }
  1974. X}
  1975. X
  1976. X#ifdef ANSI
  1977. Xstatic time_t what_time(void)
  1978. X#else
  1979. Xstatic time_t what_time()
  1980. X#endif
  1981. X{
  1982. X    return((time_t)time(NULL));
  1983. X}
  1984. X
  1985. X#ifdef ANSI
  1986. Xstatic void diff_time(time_t a, time_t b)
  1987. X#else
  1988. Xstatic void diff_time(a, b)
  1989. Xtime_t a, b;
  1990. X#endif
  1991. X{
  1992. X    struct tm    *tt;
  1993. X    char        buf1[101], buf2[101];
  1994. X    int        hour[2], min[2], sec[2];
  1995. X    time_t        x;
  1996. X
  1997. X    tt = (struct tm *)malloc(sizeof(struct tm *) + 1);
  1998. X
  1999. X    tt = (struct tm *)localtime(&a);
  2000. X    strftime(buf1, 100, "%H %M %S", tt);
  2001. X
  2002. X    tt = (struct tm *)localtime(&b);
  2003. X    strftime(buf2, 100, "%H %M %S", tt);
  2004. X
  2005. X    sscanf(buf1,"%d %d %d", &hour[0], &min[0], &sec[0]);
  2006. X    sscanf(buf2,"%d %d %d", &hour[1], &min[1], &sec[1]);
  2007. X
  2008. X    printf("Hours = %d  Mins = %d  Secs = %d\n",
  2009. X    (hour[1] - hour[0] > 0)?(hour[1] - hour[0]) : (hour[0] - hour[1]),
  2010. X    (min[1] - min[0] > 0)?(min[1] - min[0]) : (min[0] - min[1]),
  2011. X    (sec[1] - sec[0] > 0)?(sec[1] - sec[0]) : (sec[0] - sec[1]));
  2012. X}
  2013. X
  2014. Xmain()
  2015. X{
  2016. X    int    size = sizeof(catalog);
  2017. X    int    id, code;
  2018. X    time_t    start, finish;
  2019. X    catalog    rap;
  2020. X
  2021. X    /* Quick sort */
  2022. X    /* start testing sorting efficiency */
  2023. X    id = lDef(lSINGLY, lCHAIN);
  2024. X    load_it(id, 3000);
  2025. X
  2026. X    printf("Untouched list\n");
  2027. X    print_some(id, 10);
  2028. X
  2029. X    printf("-- lQuickSort --\nlQuickSort DESCENDING by TITLE : ");
  2030. X    start = what_time();
  2031. X    code = lSort(id, lDESCENDING, lQUICK, compare_title);
  2032. X    finish = what_time();
  2033. X    diff_time(start, finish);
  2034. X    print_some(id, 10);
  2035. X
  2036. X    printf("lQuickSort ASCENDING by TITLE : ");
  2037. X    start = what_time();
  2038. X    code = lSort(id, lASCENDING, lQUICK, compare_title);
  2039. X    finish = what_time();
  2040. X    diff_time(start, finish);
  2041. X    print_some(id, 10);
  2042. X
  2043. X    printf("lQuickSort DESCENDING by AUTHOR : ");
  2044. X    start = what_time();
  2045. X    code = lSort(id, lDESCENDING, lQUICK, compare_author);
  2046. X    finish = what_time();
  2047. X    diff_time(start, finish);
  2048. X    print_some(id, 10);
  2049. X
  2050. X    printf("lQuickSort ASCENDING by AUTHOR : ");
  2051. X    start = what_time();
  2052. X    code = lSort(id, lASCENDING, lQUICK, compare_author);
  2053. X    finish = what_time();
  2054. X    diff_time(start, finish);
  2055. X    print_some(id, 10);
  2056. X
  2057. X    code = lDelAll();
  2058. X
  2059. X    /* Heap sort */
  2060. X    /* start testing sorting efficiency */
  2061. X    id = lDef(lSINGLY, lCHAIN);
  2062. X    load_it(id, 3000);
  2063. X
  2064. X    printf("Untouched list\n");
  2065. X    print_some(id, 10);
  2066. X
  2067. X    printf(" -- lHeapSort -- \nlHeapSort DESCENDING by TITLE : ");
  2068. X    start = what_time();
  2069. X    code = lSort(id, lDESCENDING, lHEAP, compare_title);
  2070. X    finish = what_time();
  2071. X    diff_time(start, finish);
  2072. X    print_some(id, 10);
  2073. X
  2074. X    printf("lHeapSort ASCENDING by TITLE : ");
  2075. X    start = what_time();
  2076. X    code = lSort(id, lASCENDING, lHEAP, compare_title);
  2077. X    finish = what_time();
  2078. X    diff_time(start, finish);
  2079. X    print_some(id, 10);
  2080. X
  2081. X    printf("lHeapSort ASCENDING by AUTHOR : ");
  2082. X    start = what_time();
  2083. X    code = lSort(id, lASCENDING, lHEAP, compare_author);
  2084. X    finish = what_time();
  2085. X    diff_time(start, finish);
  2086. X    print_some(id, 10);
  2087. X
  2088. X    code = lDelAll();
  2089. X
  2090. X    /* Selection sort */
  2091. X    /* start testing sorting efficiency */
  2092. X    id = lDef(lSINGLY, lCHAIN);
  2093. X    load_it(id, 3000);
  2094. X
  2095. X    printf("Untouched list\n");
  2096. X    print_some(id, 10);
  2097. X
  2098. X    printf("lSelectionSort DESCENDING by TITLE : ");
  2099. X    start = what_time();
  2100. X    code = lSort(id, lDESCENDING, lSELECTION, compare_title);
  2101. X    finish = what_time();
  2102. X    diff_time(start, finish);
  2103. X    print_some(id, 10);
  2104. X
  2105. X    printf("lSelectionSort ASCENDING by TITLE : ");
  2106. X    start = what_time();
  2107. X    code = lSort(id, lASCENDING, lSELECTION, compare_title);
  2108. X    finish = what_time();
  2109. X    diff_time(start, finish);
  2110. X    print_some(id, 10);
  2111. X
  2112. X    printf("lSelectionSort ASCENDING by AUTHOR : ");
  2113. X    start = what_time();
  2114. X    code = lSort(id, lASCENDING, lSELECTION, compare_author);
  2115. X    finish = what_time();
  2116. X    diff_time(start, finish);
  2117. X    print_some(id, 10);
  2118. X
  2119. X    code = lDelAll();
  2120. X
  2121. X    /* insertion sort*/
  2122. X    /* start testing sorting efficiency */
  2123. X    id = lDef(lSINGLY, lCHAIN);
  2124. X    load_it(id, 3000);
  2125. X
  2126. X    printf("Untouched list\n");
  2127. X    print_some(id, 10);
  2128. X
  2129. X    printf("lInsertSort DESCENDING by TITLE : ");
  2130. X    start = what_time();
  2131. X    code = lSort(id, lDESCENDING, lINSERT, compare_title);
  2132. X    finish = what_time();
  2133. X    diff_time(start, finish);
  2134. X    print_some(id, 10);
  2135. X
  2136. X    printf("lInsertSort ASCENDING by TITLE : ");
  2137. X    start = what_time();
  2138. X    code = lSort(id, lASCENDING, lINSERT, compare_title);
  2139. X    finish = what_time();
  2140. X    diff_time(start, finish);
  2141. X    print_some(id, 10);
  2142. X
  2143. X    printf("lInsertSort ASCENDING by AUTHOR : ");
  2144. X    start = what_time();
  2145. X    code = lSort(id, lASCENDING, lINSERT, compare_author);
  2146. X    finish = what_time();
  2147. X    diff_time(start, finish);
  2148. X    print_some(id, 10);
  2149. X
  2150. X    code = lDelAll();
  2151. X
  2152. X    /* start testing sorting efficiency */
  2153. X    id = lDef(lSINGLY, lCHAIN);
  2154. X    load_it(id, 3000);
  2155. X
  2156. X    printf("Untouched list\n");
  2157. X    print_some(id, 10);
  2158. X
  2159. X    /* Bubble sort */
  2160. X    printf("lBubbleSort DESCENDING by TITLE : ");
  2161. X    start = what_time();
  2162. X    code = lSort(id, lDESCENDING, lBUBBLE, compare_title);
  2163. X    finish = what_time();
  2164. X    diff_time(start, finish);
  2165. X    print_some(id, 10);
  2166. X
  2167. X    printf("lBubbleSort ASCENDING by TITLE : ");
  2168. X    start = what_time();
  2169. X    code = lSort(id, lASCENDING, lBUBBLE, compare_title);
  2170. X    finish = what_time();
  2171. X    diff_time(start, finish);
  2172. X    print_some(id, 10);
  2173. X
  2174. X    printf("lBubbleSort ASCENDING by AUTHOR : ");
  2175. X    start = what_time();
  2176. X    code = lSort(id, lASCENDING, lBUBBLE, compare_author);
  2177. X    finish = what_time();
  2178. X    diff_time(start, finish);
  2179. X    print_some(id, 10);
  2180. X
  2181. X    code = lDelAll();
  2182. X}
  2183. X
  2184. Xstatic void
  2185. XprRap(code, rpprt)
  2186. Xint            code;
  2187. Xcatalog        *rpprt;
  2188. X{
  2189. X    if (code >= 0)
  2190. X        printf("catalog :'%s' '%s' '%s' '%d'\n", rpprt->number, rpprt->title,
  2191. X            rpprt->author, rpprt->date);
  2192. X    else
  2193. X        printf("Return code = %d\n", code);
  2194. X}
  2195. END_OF_FILE
  2196.   if test 7365 -ne `wc -c <'sorttest.c'`; then
  2197.     echo shar: \"'sorttest.c'\" unpacked with wrong size!
  2198.   fi
  2199.   # end of 'sorttest.c'
  2200. fi
  2201. echo shar: End of archive 2 \(of 2\).
  2202. cp /dev/null ark2isdone
  2203. MISSING=""
  2204. for I in 1 2 ; do
  2205.     if test ! -f ark${I}isdone ; then
  2206.     MISSING="${MISSING} ${I}"
  2207.     fi
  2208. done
  2209. if test "${MISSING}" = "" ; then
  2210.     echo You have unpacked both archives.
  2211.     rm -f ark[1-9]isdone
  2212. else
  2213.     echo You still must unpack the following archives:
  2214.     echo "        " ${MISSING}
  2215. fi
  2216. exit 0
  2217. exit 0 # Just in case...
  2218.